﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using EvaluacionExalmarOledbHelper;
using EvaluacionExalmarEntidades;
using EvaluacionExalmarInterfaces;
using System.Configuration;
using System.Text;


namespace EvaluacionExalmarAccesoDatos
{
    public class Jerarquia : IJerarquia
    {
        #region IJerarquia Members

        private readonly String _sCadenaConexion = ConfigurationManager.ConnectionStrings["con"].ConnectionString;

        public JerarquiaInfo Consultar(JerarquiaInfo oJerarquia)
        {
            throw new NotImplementedException();
        }

        public IList<JerarquiaInfo> Listar(JerarquiaInfo oJerarquia)
        {
            throw new NotImplementedException();
        }

        public bool Registrar(JerarquiaInfo oJerarquia)
        {
            Boolean bExito;
            const String query =
                "Insert into Jerarquia (Id_Empleado, Id_Tipo_Jerarquia, Id_Empleado_Jerarquia) Values (?, ?, ?)";

            var oledbParm = new OleDbParameter[3];


            using (var con = new OleDbConnection(_sCadenaConexion))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    oledbParm[0] = new OleDbParameter("@Id_Empleado", OleDbType.Integer) {Value = oJerarquia.IdEmpleado};
                    oledbParm[1] = new OleDbParameter("@Id_Tipo_Jerarquia", OleDbType.Integer)
                        {
                            Value = oJerarquia.IdTipoJerarquia
                        };
                    oledbParm[2] = new OleDbParameter("@Id_Empleado_Jerarquia", OleDbType.Integer)
                        {
                            Value = oJerarquia.IdEmpleadoJerarquia
                        };

                    OleDbHelper.ExecuteNonQuery(trx, CommandType.Text, query, oledbParm);
                    bExito = true;
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    bExito = false;
                }
                finally
                {
                    con.Close();
                }
            }
            return bExito;
        }

        public bool Actualizar(JerarquiaInfo oJerarquia)
        {
            throw new NotImplementedException();
        }

        public bool Eliminar(JerarquiaInfo oJerarquia)
        {
            Boolean bExito;
            const String query =
                "Delete from Jerarquia Where Id_Empleado = ? and Id_Tipo_Jerarquia = ? and Id_Empleado_Jerarquia = ?";

            var oledbParm = new OleDbParameter[3];


            using (var con = new OleDbConnection(_sCadenaConexion))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    oledbParm[0] = new OleDbParameter("@Id_Empleado", OleDbType.Integer) { Value = oJerarquia.IdEmpleado };
                    oledbParm[1] = new OleDbParameter("@Id_Tipo_Jerarquia", OleDbType.Integer)
                    {
                        Value = oJerarquia.IdTipoJerarquia
                    };
                    oledbParm[2] = new OleDbParameter("@Id_Empleado_Jerarquia", OleDbType.Integer)
                    {
                        Value = oJerarquia.IdEmpleadoJerarquia
                    };

                    OleDbHelper.ExecuteNonQuery(trx, CommandType.Text, query, oledbParm);
                    bExito = true;
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    bExito = false;
                }
                finally
                {
                    con.Close();
                }
            }
            return bExito;
        }

        public IList<JerarquiaInfo> ListarJefes(JerarquiaInfo oJerarquia)
        {
            var query = new StringBuilder("SELECT Id, Nombre, Apellido_Paterno, Apellido_Materno, Id_Tipo_Jerarquia, Tipo_Jerarquia, Id_Empleado_Jerarquia, Nombre_Jerarquia, " +
                                          "Apellido_Paterno_Jerarquia, Apellido_Materno_Jerarquia, Etapa_Contribucion_Jerarquia From ConsultaJefeInmediato ");

            if (oJerarquia != null)
            {
                var where = new StringBuilder(" where ");
                if (oJerarquia.IdEmpleado.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" Id = " + oJerarquia.IdEmpleado.ToString());
                }

                query.Append(@where);
            }

            var oListaJefes = new List<JerarquiaInfo>();
            using (var drd = OleDbHelper.ExecuteReader(_sCadenaConexion, CommandType.Text, query.ToString()))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaJefes.Add(new JerarquiaInfo(drd.GetInt32(0), new EmpleadoInfo(drd.GetInt32(0), drd.GetString(1).Trim(), drd.GetString(2).Trim(), drd.GetString(3).Trim(), null, null, null, null, null), 
                                drd.GetInt32(4), new TipoJerarquiaInfo(drd.GetInt32(4), drd.GetString(5).Trim(), null), 
                                drd.GetInt32(6), new EmpleadoInfo(drd.GetInt32(6), drd.GetString(7).Trim(), drd.GetString(8).Trim(), drd.GetString(9).Trim(), null, null, null, drd.GetInt32(10), null)));
                        }
                    }
                }
            }
            return oListaJefes;
        }

        public IList<JerarquiaInfo> ListarSubordinados(JerarquiaInfo oJerarquia)
        {
            var query = new StringBuilder("SELECT Id, Nombre, Apellido_Paterno, Apellido_Materno, Id_Tipo_Jerarquia, Tipo_Jerarquia, Id_Empleado_Jerarquia, Nombre_Jerarquia, " +
                                          "Apellido_Paterno_Jerarquia, Apellido_Materno_Jerarquia, Etapa_Contribucion_Jerarquia From ConsultaSubordinados ");

            if (oJerarquia != null)
            {
                var where = new StringBuilder(" where ");
                if (oJerarquia.IdEmpleado.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" Id = " + oJerarquia.IdEmpleado.ToString());
                }

                query.Append(@where);
            }

            var oListaSubordinados = new List<JerarquiaInfo>();
            using (var drd = OleDbHelper.ExecuteReader(_sCadenaConexion, CommandType.Text, query.ToString()))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaSubordinados.Add(new JerarquiaInfo(drd.GetInt32(0), new EmpleadoInfo(drd.GetInt32(0), drd.GetString(1).Trim(), drd.GetString(2).Trim(), drd.GetString(3).Trim(), null, null, null, null, null),
                                drd.GetInt32(4), new TipoJerarquiaInfo(drd.GetInt32(4), drd.GetString(5).Trim(), null),
                                drd.GetInt32(6), new EmpleadoInfo(drd.GetInt32(6), drd.GetString(7).Trim(), drd.GetString(8).Trim(), drd.GetString(9).Trim(), null, null, null, drd.GetInt32(10), null)));
                        }
                    }
                }
            }
            return oListaSubordinados;
        }

        public IList<JerarquiaInfo> ListarAutoevaluación(JerarquiaInfo oJerarquia)
        {
            var query = new StringBuilder("SELECT Id, Nombre, Apellido_Paterno, Apellido_Materno, Id_Tipo_Jerarquia, Tipo_Jerarquia, Id_Empleado_Jerarquia, Nombre_Jerarquia, " +
                                          "Apellido_Paterno_Jerarquia, Apellido_Materno_Jerarquia, Etapa_Contribucion_Jerarquia From ConsultaAutoevaluacion ");

            if (oJerarquia != null)
            {
                var where = new StringBuilder(" where ");
                if (oJerarquia.IdEmpleado.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" Id = " + oJerarquia.IdEmpleado.ToString());
                }

                query.Append(@where);
            }

            var oListaAutoevaluacion = new List<JerarquiaInfo>();
            using (var drd = OleDbHelper.ExecuteReader(_sCadenaConexion, CommandType.Text, query.ToString()))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaAutoevaluacion.Add(new JerarquiaInfo(drd.GetInt32(0), new EmpleadoInfo(drd.GetInt32(0), drd.GetString(1).Trim(), drd.GetString(2).Trim(), drd.GetString(3).Trim(), null, null, null, null, null),
                                drd.GetInt32(4), new TipoJerarquiaInfo(drd.GetInt32(4), drd.GetString(5).Trim(), null),
                                drd.GetInt32(6), new EmpleadoInfo(drd.GetInt32(6), drd.GetString(7).Trim(), drd.GetString(8).Trim(), drd.GetString(9).Trim(), null, null, null, drd.GetInt32(10), null)));
                        }
                    }
                }
            }
            return oListaAutoevaluacion;
        }

        #endregion
    }
}
